#ifndef GETCPUTIMERCLOCKFREQUENCY_H
#define GETCPUTIMERCLOCKFREQUENCY_H

/***********************************************
 *
 *
 * 获取cpu时间进行的精确计算
 * https://www.jianshu.com/p/4993219ed5ef
 * https://blog.csdn.net/MMTS_yang/article/details/101440419
 *  获取CPU的时钟进而进行实践的计算，比较精确
 * 首先调用QueryPerFormanceFrequency函数取得高精度运行计数器的频率f，单位是每秒多少次（n/s）
 * 此数一般很大。
 *
 * 再需要定时的代码两端分别调用QueryPerFormanceCounter以取得高精度运行计数器的值n1，n2.
 * 两次数值的差值通过f换算成时间间隔， t=（n2-n1）/f
 *
 *
 * **********************************************/
#include <qt_windows.h>
#include <QDebug>
class GetCPUTimerClockFrequency
{
public:
    GetCPUTimerClockFrequency()
    {

    }

    void _my_msleepByCPU(double mSleepTime)//设置ms延时
    {
        LARGE_INTEGER Iitmp;
        LONGLONG Qpart1, Qpart2;
        double dfMinus = 0, dfFreq=0, dfTime=0;

        //获取CPU计时器的时钟频率

        QueryPerformanceFrequency(&Iitmp);//取得高精度运行计数器的频率f，单位时每秒多少次（n/s)
        dfFreq = (double)Iitmp.QuadPart;

        QueryPerformanceCounter(&Iitmp);//取得高精度运行计数器的数值
        Qpart1 = Iitmp.QuadPart;//开始计时

        while(mSleepTime-dfTime*1000.000>0.0000001)
        {
            QueryPerformanceCounter(&Iitmp);
            Qpart2 = Iitmp.QuadPart;//中止计时

            dfMinus = (double)(Qpart2-Qpart1);//计算计数器值
            dfTime = dfMinus/dfFreq;//获得对应时间，单位为秒，可以乘10000000精确到微秒级（us）
            qDebug() << "ms:" << QString::number(dfTime*100.00,'f',9);
        }


    }

//    void _my_usleepByCPU(double uSleepTime);//设置微秒延时
};

#endif // GETCPUTIMERCLOCKFREQUENCY_H
